package clientV3;

import invokerV3.IhmImplV3;

import java.util.HashMap;

import originatorV2.Arreter;
import originatorV2.CollerOriginator;
import originatorV2.CopierOriginator;
import originatorV2.CouperOriginator;
import originatorV2.Demarrer;
import originatorV2.Rejouer;
import originatorV2.SaisirOriginator;
import originatorV2.SelectionnerOriginator;
import originatorV3.CollerOriginatorV3;
import originatorV3.CopierOriginatorV3;
import originatorV3.CouperOriginatorV3;
import originatorV3.Defaire;
import originatorV3.Refaire;
import originatorV3.SaisirOriginatorV3;
import originatorV3.SelectionnerOriginatorV3;
import receiver.MiniEditeurImpl;
import caretakerV2.Enregistreur;
import caretakerV2.EnregistreurImpl;
import caretakerV3.GestionDefaire;
import caretakerV3.GestionDefaireImpl;

import command.Coller;
import command.Command;
import command.Copier;
import command.Couper;
import command.SaisirTexte;
import command.Selectionner;

public class EditeurV3 {

	private MiniEditeurImpl miniEditeur;

	private IhmImplV3 ihm;

	private HashMap<String, Command> lesCommandes;

	private Enregistreur enreg;
	
	private GestionDefaire gestion;

	/**
	 * méthode qui permet d'instancer l'ihm, le miniEditeur, l'enregsitreur, la gestion defaire/refaire et de mettre les commandes dans un HashMap 
	 */
	public void initialize(){

		miniEditeur = new MiniEditeurImpl();
		lesCommandes = new HashMap<String, Command>();
		ihm = new IhmImplV3();
		enreg = new EnregistreurImpl();
		gestion = new GestionDefaireImpl(miniEditeur);
		
		lesCommandes.put("Selectionner", new Selectionner(miniEditeur,ihm));
		lesCommandes.put("Copier", new Copier(miniEditeur));
		lesCommandes.put("Coller", new Coller(miniEditeur));
		lesCommandes.put("Couper", new Couper(miniEditeur));
		lesCommandes.put("Saisir", new SaisirTexte(miniEditeur,ihm));
		
		lesCommandes.put("Demarrer", new Demarrer(enreg));
		lesCommandes.put("Rejouer", new Rejouer(enreg));
		lesCommandes.put("Arreter", new Arreter(enreg));
		
		lesCommandes.put("SaisirOriginator", new SaisirOriginator(enreg, lesCommandes.get("Saisir")));
		lesCommandes.put("CopierOriginator", new CopierOriginator(enreg, lesCommandes.get("Copier")));
		lesCommandes.put("CollerOriginator", new CollerOriginator(enreg, lesCommandes.get("Coller")));
		lesCommandes.put("CouperOriginator", new CouperOriginator(enreg, lesCommandes.get("Couper")));
		lesCommandes.put("SelectionnerOriginator", new SelectionnerOriginator(enreg,
				lesCommandes.get("Selectionner")));
		
		lesCommandes.put("SaisirOriginatorV3", new SaisirOriginatorV3(gestion, lesCommandes.get("SaisirOriginator")));
		lesCommandes.put("SelectionnerOriginatorV3", new SelectionnerOriginatorV3(gestion, lesCommandes.get("SelectionnerOriginator")));
		lesCommandes.put("CopierOriginatorV3", new CopierOriginatorV3(lesCommandes.get("CopierOriginator"), gestion ));
		lesCommandes.put("CollerOriginatorV3", new CollerOriginatorV3(lesCommandes.get("CollerOriginator"), gestion ));
		lesCommandes.put("CouperOriginatorV3", new CouperOriginatorV3(lesCommandes.get("CouperOriginator"), gestion ));
		
		lesCommandes.put("Defaire", new Defaire(gestion) );
		lesCommandes.put("Refaire", new Refaire(gestion) );

		ihm.set_lesCommandes(lesCommandes);
		miniEditeur.addObserver(ihm);
	}

	/**
	 * main de l'application V3 qui est appelé au démarrage
	 * @param args
	 */
	public static void main(String[] args) {
		EditeurV3 edit = new EditeurV3();
		edit.initialize();
	}

}
